{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sys.version_info(major=3, minor=10, micro=8, releaselevel='final', serial=0)\n",
      "matplotlib 3.6.3\n",
      "numpy 1.23.5\n",
      "pandas 1.5.2\n",
      "sklearn 1.2.0\n",
      "torch 1.13.1+cu117\n",
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "from tqdm.auto import tqdm\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "print(sys.version_info)\n",
    "for module in mpl, np, pd, sklearn, torch:\n",
    "    print(module.__name__, module.__version__)\n",
    "    \n",
    "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
    "print(device)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 加载数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torchvision import datasets\n",
    "from torchvision.transforms import ToTensor\n",
    "\n",
    "# fashion_mnist图像分类数据集\n",
    "train_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=True,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "test_ds = datasets.FashionMNIST(\n",
    "    root=\"data\",\n",
    "    train=False,\n",
    "    download=True,\n",
    "    transform=ToTensor()\n",
    ")\n",
    "\n",
    "# torchvision 数据集里没有提供训练集和验证集的划分\n",
    "# 当然也可以用 torch.utils.data.Dataset 实现人为划分\n",
    "# 从数据集到dataloader\n",
    "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=16, shuffle=True)\n",
    "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=16, shuffle=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(tensor([0.2860]), tensor([0.3205]))\n"
     ]
    }
   ],
   "source": [
    "from torchvision.transforms import Normalize\n",
    "\n",
    "# 遍历train_ds得到每张图片，计算每个通道的均值和方差\n",
    "def cal_mean_std(ds):\n",
    "    mean = 0.\n",
    "    std = 0.\n",
    "    for img, _ in ds:\n",
    "        mean += img.mean(dim=(1, 2))\n",
    "        std += img.std(dim=(1, 2))\n",
    "    mean /= len(ds)\n",
    "    std /= len(ds)\n",
    "    return mean, std\n",
    "\n",
    "\n",
    "print(cal_mean_std(train_ds))\n",
    "# 0.2860， 0.3205\n",
    "transforms = nn.Sequential(\n",
    "    Normalize([0.2860], [0.3205])\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 定义模型\n",
    "\n",
    "这里我们没有用`nn.Linear`的默认初始化，而是采用了xavier均匀分布去初始化全连接层的权重\n",
    "\n",
    "xavier初始化出自论文 《Understanding the difficulty of training deep feedforward neural networks》，适用于使用`tanh`和`sigmoid`激活函数的方法。当然，我们这里的模型采用的是`relu`激活函数，采用He初始化（何凯明初始化）会更加合适。感兴趣的同学可以自己动手修改并比对效果。\n",
    "\n",
    "|神经网络层数|初始化方式|early stop at epoch| val_loss | vla_acc|\n",
    "|-|-|-|-|-|\n",
    "|20|默认|\n",
    "|20|xaviier_uniform|\n",
    "|20|he_uniform|\n",
    "|...|\n",
    "\n",
    "He初始化出自论文 《Delving deep into rectifiers: Surpassing human-level performance on ImageNet classification》"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "               layer_name               \tparamerters num\n",
      "linear_relu_stack.0.weight              \t  78400   \n",
      "linear_relu_stack.0.bias                \t   100    \n",
      "linear_relu_stack.1.weight              \t   100    \n",
      "linear_relu_stack.1.bias                \t   100    \n",
      "linear_relu_stack.Linear_1.weight       \t  10000   \n",
      "linear_relu_stack.Linear_1.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_1.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_1.bias      \t   100    \n",
      "linear_relu_stack.Linear_2.weight       \t  10000   \n",
      "linear_relu_stack.Linear_2.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_2.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_2.bias      \t   100    \n",
      "linear_relu_stack.Linear_3.weight       \t  10000   \n",
      "linear_relu_stack.Linear_3.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_3.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_3.bias      \t   100    \n",
      "linear_relu_stack.Linear_4.weight       \t  10000   \n",
      "linear_relu_stack.Linear_4.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_4.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_4.bias      \t   100    \n",
      "linear_relu_stack.Linear_5.weight       \t  10000   \n",
      "linear_relu_stack.Linear_5.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_5.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_5.bias      \t   100    \n",
      "linear_relu_stack.Linear_6.weight       \t  10000   \n",
      "linear_relu_stack.Linear_6.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_6.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_6.bias      \t   100    \n",
      "linear_relu_stack.Linear_7.weight       \t  10000   \n",
      "linear_relu_stack.Linear_7.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_7.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_7.bias      \t   100    \n",
      "linear_relu_stack.Linear_8.weight       \t  10000   \n",
      "linear_relu_stack.Linear_8.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_8.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_8.bias      \t   100    \n",
      "linear_relu_stack.Linear_9.weight       \t  10000   \n",
      "linear_relu_stack.Linear_9.bias         \t   100    \n",
      "linear_relu_stack.batchnorm_9.weight    \t   100    \n",
      "linear_relu_stack.batchnorm_9.bias      \t   100    \n",
      "linear_relu_stack.Linear_10.weight      \t  10000   \n",
      "linear_relu_stack.Linear_10.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_10.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_10.bias     \t   100    \n",
      "linear_relu_stack.Linear_11.weight      \t  10000   \n",
      "linear_relu_stack.Linear_11.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_11.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_11.bias     \t   100    \n",
      "linear_relu_stack.Linear_12.weight      \t  10000   \n",
      "linear_relu_stack.Linear_12.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_12.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_12.bias     \t   100    \n",
      "linear_relu_stack.Linear_13.weight      \t  10000   \n",
      "linear_relu_stack.Linear_13.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_13.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_13.bias     \t   100    \n",
      "linear_relu_stack.Linear_14.weight      \t  10000   \n",
      "linear_relu_stack.Linear_14.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_14.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_14.bias     \t   100    \n",
      "linear_relu_stack.Linear_15.weight      \t  10000   \n",
      "linear_relu_stack.Linear_15.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_15.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_15.bias     \t   100    \n",
      "linear_relu_stack.Linear_16.weight      \t  10000   \n",
      "linear_relu_stack.Linear_16.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_16.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_16.bias     \t   100    \n",
      "linear_relu_stack.Linear_17.weight      \t  10000   \n",
      "linear_relu_stack.Linear_17.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_17.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_17.bias     \t   100    \n",
      "linear_relu_stack.Linear_18.weight      \t  10000   \n",
      "linear_relu_stack.Linear_18.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_18.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_18.bias     \t   100    \n",
      "linear_relu_stack.Linear_19.weight      \t  10000   \n",
      "linear_relu_stack.Linear_19.bias        \t   100    \n",
      "linear_relu_stack.batchnorm_19.weight   \t   100    \n",
      "linear_relu_stack.batchnorm_19.bias     \t   100    \n",
      "linear_relu_stack.Output Layer.weight   \t   1000   \n",
      "linear_relu_stack.Output Layer.bias     \t    10    \n"
     ]
    }
   ],
   "source": [
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self, layers_num=2):\n",
    "        super().__init__()\n",
    "        self.transforms = transforms\n",
    "        self.flatten = nn.Flatten()\n",
    "        # 多加几层\n",
    "        self.linear_relu_stack = nn.Sequential(\n",
    "            nn.Linear(28 * 28, 100),  # in_features=784, out_features=300\n",
    "            # 一般而言，先batch norm 后 激活函数\n",
    "            # 参见论文 《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》\n",
    "            nn.BatchNorm1d(100),  # num of features=100\n",
    "            nn.ReLU(),\n",
    "        )\n",
    "        # 加19层\n",
    "        for i in range(1, layers_num):\n",
    "            self.linear_relu_stack.add_module(f\"Linear_{i}\", nn.Linear(100, 100))\n",
    "            self.linear_relu_stack.add_module(f\"batchnorm_{i}\", nn.BatchNorm1d(100))\n",
    "            self.linear_relu_stack.add_module(f\"relu\", nn.ReLU())\n",
    "        # 输出层\n",
    "        self.linear_relu_stack.add_module(\"Output Layer\", nn.Linear(100, 10))\n",
    "        \n",
    "        self.init_weights()\n",
    "        \n",
    "    def init_weights(self):\n",
    "        \"\"\"使用 xavier 均匀分布来初始化全连接层的权重 W\"\"\"\n",
    "        for m in self.modules():\n",
    "            if isinstance(m, nn.Linear):\n",
    "                nn.init.xavier_uniform_(m.weight)\n",
    "                nn.init.zeros_(m.bias)\n",
    "\n",
    "    def forward(self, x):\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x = self.transforms(x)\n",
    "        x = self.flatten(x)  \n",
    "        # 展平后 x.shape [batch size, 28 * 28]\n",
    "        logits = self.linear_relu_stack(x)\n",
    "        # logits.shape [batch size, 10]\n",
    "        return logits\n",
    "\n",
    "print(f\"{'layer_name':^40}\\tparamerters num\")\n",
    "for idx, (key, value) in enumerate(NeuralNetwork(20).named_parameters()):\n",
    "    print(\"{:<40}\\t{:^10}\".format(key, np.prod(value.shape)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "@torch.no_grad()\n",
    "def evaluating(model, dataloader, loss_fct):\n",
    "    loss_list = []\n",
    "    pred_list = []\n",
    "    label_list = []\n",
    "    for datas, labels in dataloader:\n",
    "        datas = datas.to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 前向计算\n",
    "        logits = model(datas)\n",
    "        loss = loss_fct(logits, labels)         # 验证集损失\n",
    "        loss_list.append(loss.item())\n",
    "        \n",
    "        preds = logits.argmax(axis=-1)    # 验证集预测\n",
    "        pred_list.extend(preds.cpu().numpy().tolist())\n",
    "        label_list.extend(labels.cpu().numpy().tolist())\n",
    "        \n",
    "    acc = accuracy_score(label_list, pred_list)\n",
    "    return np.mean(loss_list), acc\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "from torch.utils.tensorboard import SummaryWriter\n",
    "\n",
    "\n",
    "class TensorBoardCallback:\n",
    "    def __init__(self, log_dir, flush_secs=10):\n",
    "        \"\"\"\n",
    "        Args:\n",
    "            log_dir (str): dir to write log.\n",
    "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
    "        \"\"\"\n",
    "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs)\n",
    "\n",
    "    def draw_model(self, model, input_shape):\n",
    "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape))\n",
    "        \n",
    "    def add_loss_scalars(self, step, loss, val_loss):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/loss\", \n",
    "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
    "            global_step=step,\n",
    "            )\n",
    "        \n",
    "    def add_acc_scalars(self, step, acc, val_acc):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/accuracy\",\n",
    "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
    "            global_step=step,\n",
    "        )\n",
    "        \n",
    "    def add_lr_scalars(self, step, learning_rate):\n",
    "        self.writer.add_scalars(\n",
    "            main_tag=\"training/learning_rate\",\n",
    "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
    "            global_step=step,\n",
    "            \n",
    "        )\n",
    "    \n",
    "    def __call__(self, step, **kwargs):\n",
    "        # add loss\n",
    "        loss = kwargs.pop(\"loss\", None)\n",
    "        val_loss = kwargs.pop(\"val_loss\", None)\n",
    "        if loss is not None and val_loss is not None:\n",
    "            self.add_loss_scalars(step, loss, val_loss)\n",
    "        # add acc\n",
    "        acc = kwargs.pop(\"acc\", None)\n",
    "        val_acc = kwargs.pop(\"val_acc\", None)\n",
    "        if acc is not None and val_acc is not None:\n",
    "            self.add_acc_scalars(step, acc, val_acc)\n",
    "        # add lr\n",
    "        learning_rate = kwargs.pop(\"lr\", None)\n",
    "        if learning_rate is not None:\n",
    "            self.add_lr_scalars(step, learning_rate)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "class SaveCheckpointsCallback:\n",
    "    def __init__(self, save_dir, save_step=5000, save_best_only=True):\n",
    "        \"\"\"\n",
    "        Save checkpoints each save_epoch epoch. \n",
    "        We save checkpoint by epoch in this implementation.\n",
    "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
    "\n",
    "        Args:\n",
    "            save_dir (str): dir to save checkpoint\n",
    "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
    "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
    "        \"\"\"\n",
    "        self.save_dir = save_dir\n",
    "        self.save_step = save_step\n",
    "        self.save_best_only = save_best_only\n",
    "        self.best_metrics = -1\n",
    "        \n",
    "        # mkdir\n",
    "        if not os.path.exists(self.save_dir):\n",
    "            os.mkdir(self.save_dir)\n",
    "        \n",
    "    def __call__(self, step, state_dict, metric=None):\n",
    "        if step % self.save_step > 0:\n",
    "            return\n",
    "        \n",
    "        if self.save_best_only:\n",
    "            assert metric is not None\n",
    "            if metric >= self.best_metrics:\n",
    "                # save checkpoints\n",
    "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\"))\n",
    "                # update best metrics\n",
    "                self.best_metrics = metric\n",
    "        else:\n",
    "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\"))\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "class EarlyStopCallback:\n",
    "    def __init__(self, patience=5, min_delta=0.01):\n",
    "        \"\"\"\n",
    "\n",
    "        Args:\n",
    "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
    "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute \n",
    "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
    "        \"\"\"\n",
    "        self.patience = patience\n",
    "        self.min_delta = min_delta\n",
    "        self.best_metric = -1\n",
    "        self.counter = 0\n",
    "        \n",
    "    def __call__(self, metric):\n",
    "        if metric >= self.best_metric + self.min_delta:\n",
    "            # update best metric\n",
    "            self.best_metric = metric\n",
    "            # reset counter \n",
    "            self.counter = 0\n",
    "        else: \n",
    "            self.counter += 1\n",
    "            \n",
    "    @property\n",
    "    def early_stop(self):\n",
    "        return self.counter >= self.patience\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-03-28 21:32:42.202525: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX_VNNI FMA\n",
      "To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
      "2023-03-28 21:32:42.275294: I tensorflow/core/util/port.cc:104] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "debf618033ff437283691c6d02cbcb8f",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/375000 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Early stop at epoch 29 / global_step 108750\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "def training(\n",
    "    model, \n",
    "    train_loader, \n",
    "    val_loader, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=None,\n",
    "    save_ckpt_callback=None,\n",
    "    early_stop_callback=None,\n",
    "    eval_step=500,\n",
    "    ):\n",
    "    record_dict = {\n",
    "        \"train\": [],\n",
    "        \"val\": []\n",
    "    }\n",
    "    \n",
    "    global_step = 0\n",
    "    model.train()\n",
    "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
    "        for epoch_id in range(epoch):\n",
    "            # training\n",
    "            for datas, labels in train_loader:\n",
    "                datas = datas.to(device)\n",
    "                labels = labels.to(device)\n",
    "                # 梯度清空\n",
    "                optimizer.zero_grad()\n",
    "                # 模型前向计算\n",
    "                logits = model(datas)\n",
    "                # 计算损失\n",
    "                loss = loss_fct(logits, labels)\n",
    "                # 梯度回传\n",
    "                loss.backward()\n",
    "                # 调整优化器，包括学习率的变动等\n",
    "                optimizer.step()\n",
    "                preds = logits.argmax(axis=-1)\n",
    "            \n",
    "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())    \n",
    "                loss = loss.cpu().item()\n",
    "                # record\n",
    "                \n",
    "                record_dict[\"train\"].append({\n",
    "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
    "                })\n",
    "                \n",
    "                # evaluating\n",
    "                if global_step % eval_step == 0:\n",
    "                    model.eval()\n",
    "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
    "                    record_dict[\"val\"].append({\n",
    "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
    "                    })\n",
    "                    model.train()\n",
    "                    \n",
    "                    # 1. 使用 tensorboard 可视化\n",
    "                    if tensorboard_callback is not None:\n",
    "                        tensorboard_callback(\n",
    "                            global_step, \n",
    "                            loss=loss, val_loss=val_loss,\n",
    "                            acc=acc, val_acc=val_acc,\n",
    "                            lr=optimizer.param_groups[0][\"lr\"],\n",
    "                            )\n",
    "                    \n",
    "                    # 2. 保存模型权重 save model checkpoint\n",
    "                    if save_ckpt_callback is not None:\n",
    "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc)\n",
    "\n",
    "                    # 3. 早停 Early Stop\n",
    "                    if early_stop_callback is not None:\n",
    "                        early_stop_callback(val_acc)\n",
    "                        if early_stop_callback.early_stop:\n",
    "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
    "                            return record_dict\n",
    "                    \n",
    "                # udate step\n",
    "                global_step += 1\n",
    "                pbar.update(1)\n",
    "                pbar.set_postfix({\"epoch\": epoch_id})\n",
    "        \n",
    "    return record_dict\n",
    "        \n",
    "\n",
    "epoch = 100\n",
    "\n",
    "# 别 20 层了 2333，太深了没法训练\n",
    "model = NeuralNetwork(layers_num=20)\n",
    "\n",
    "# 1. 定义损失函数 采用交叉熵损失\n",
    "loss_fct = nn.CrossEntropyLoss()\n",
    "# 2. 定义优化器 采用SGD\n",
    "# Optimizers specified in the torch.optim package\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
    "\n",
    "# 1. tensorboard 可视化\n",
    "tensorboard_callback = TensorBoardCallback(\"runs/bn\")\n",
    "tensorboard_callback.draw_model(model, [1, 28, 28])\n",
    "# 2. save best\n",
    "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints/bn\", save_best_only=True)\n",
    "# 3. early stop\n",
    "early_stop_callback = EarlyStopCallback(patience=10, min_delta=0.001)\n",
    "\n",
    "model = model.to(device)\n",
    "record = training(\n",
    "    model, \n",
    "    train_loader, \n",
    "    val_loader, \n",
    "    epoch, \n",
    "    loss_fct, \n",
    "    optimizer, \n",
    "    tensorboard_callback=tensorboard_callback,\n",
    "    save_ckpt_callback=save_ckpt_callback,\n",
    "    early_stop_callback=early_stop_callback,\n",
    "    eval_step=len(train_loader)\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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qCYiIiIiIiIqJRbVRERERERERKXEopqIiIiIiIiolFhUExEREREREZUSi2oiIiIiIiKiUmJRTURERERERFRKLKqJqqHhw4ejb9++pg6DiIiIKgj7eiLzwaKaiIiIiIiIqJRYVBNVYT/99BP8/PygVCrh7OyMbt26YerUqfj222+xfft2SCQSSCQS7N+/HwCQkJCAl156CQ4ODnByckKfPn0QFxenP1/ht95z5syBq6sr7O3tMWbMGOTl5ZnmDRIREVk49vVE5s/K1AEQUekkJiZi0KBBWLBgAfr164eMjAwcOnQIr776KuLj45Geno41a9YAAJycnKDRaBASEoKgoCAcOnQIVlZW+Oijj9C9e3ecPn0acrkcABAREQEbGxvs378fcXFxGDFiBJydnTFv3jxTvl0iIiKLw76eqGpgUU1URSUmJiI/Px/9+/eHl5cXAMDPzw8AoFQqkZubC3d3d337devWQavVYtWqVZBIJACANWvWwMHBAfv378dzzz0HAJDL5Vi9ejVUKhWaNWuGDz/8EFOnTsXcuXMhlXJyCxERUWVhX09UNfB/DVEV1bJlSwQHB8PPzw8DBgzAypUr8e+//xptHxMTgytXrsDOzg62trawtbWFk5MTcnJycPXqVYPzqlQq/f2goCBkZmYiISGhQt8PERERGWJfT1Q1cKSaqIqSyWQIDw/Hn3/+iT/++ANLly7FjBkzEBUVVWT7zMxMtG3bFuvXr3/kMVdX14oOl4iIiEqIfT1R1cCimqgKk0gk6NChAzp06IBZs2bBy8sLW7duhVwuR0FBgUHbNm3a4Mcff4Sbmxvs7e2NnjMmJgbZ2dlQKpUAgKNHj8LW1hYeHh4V+l6IiIjoUezricwfp38TVVFRUVH4+OOPcfz4ccTHx2PLli1ISUlBkyZN4O3tjdOnTyM2Nha3b9+GRqPBkCFD4OLigj59+uDQoUO4fv069u/fjzfffBM3btzQnzcvLw8jR47E+fPnsWvXLnzwwQeYMGECr7EiIiKqZOzriaoGjlQTVVH29vY4ePAgFi9ejPT0dHh5eWHhwoXo0aMH/P39sX//fvj7+yMzMxP79u1D165dcfDgQbzzzjvo378/MjIyUKdOHQQHBxt8mx0cHAxfX1907twZubm5GDRoEGbPnm26N0pERGSh2NcTVQ0SIYQwdRBEZB6GDx+OtLQ0bNu2zdShEBERUQVgX09U/jjHg4iIiIiIiKiUWFQTERERERERlRKnfxMRERERERGVEkeqiYiIiIiIiEqJRTURERERERFRKbGoJiIiIiIiIiolFtVEREREREREpcSimoiIiIiIiKiUWFQTERERERERlRKLaiIiIiIiIqJSYlFNREREREREVEosqomIiIiIiIhK6f8B1iW1tQKbdDQAAAAASUVORK5CYII=",
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n",
       "  \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n",
       "<svg xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"706.903125pt\" height=\"321.95625pt\" viewBox=\"0 0 706.903125 321.95625\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\">\n",
       " <metadata>\n",
       "  <rdf:RDF xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n",
       "   <cc:Work>\n",
       "    <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"/>\n",
       "    <dc:date>2023-03-28T21:50:45.111018</dc:date>\n",
       "    <dc:format>image/svg+xml</dc:format>\n",
       "    <dc:creator>\n",
       "     <cc:Agent>\n",
       "      <dc:title>Matplotlib v3.6.3, https://matplotlib.org/</dc:title>\n",
       "     </cc:Agent>\n",
       "    </dc:creator>\n",
       "   </cc:Work>\n",
       "  </rdf:RDF>\n",
       " </metadata>\n",
       " <defs>\n",
       "  <style type=\"text/css\">*{stroke-linejoin: round; stroke-linecap: butt}</style>\n",
       " </defs>\n",
       " <g id=\"figure_1\">\n",
       "  <g id=\"patch_1\">\n",
       "   <path d=\"M 0 321.95625 \n",
       "L 706.903125 321.95625 \n",
       "L 706.903125 0 \n",
       "L 0 0 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "  </g>\n",
       "  <g id=\"axes_1\">\n",
       "   <g id=\"patch_2\">\n",
       "    <path d=\"M 30.103125 284.4 \n",
       "L 334.466761 284.4 \n",
       "L 334.466761 7.2 \n",
       "L 30.103125 7.2 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_1\">\n",
       "    <g id=\"xtick_1\">\n",
       "     <g id=\"line2d_1\">\n",
       "      <path d=\"M 43.937836 284.4 \n",
       "L 43.937836 7.2 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_2\">\n",
       "      <defs>\n",
       "       <path id=\"m946cae5094\" d=\"M 0 0 \n",
       "L 0 3.5 \n",
       "\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"43.937836\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_1\">\n",
       "      <!-- 0 -->\n",
       "      <g transform=\"translate(40.756586 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-30\" d=\"M 2034 4250 \n",
       "Q 1547 4250 1301 3770 \n",
       "Q 1056 3291 1056 2328 \n",
       "Q 1056 1369 1301 889 \n",
       "Q 1547 409 2034 409 \n",
       "Q 2525 409 2770 889 \n",
       "Q 3016 1369 3016 2328 \n",
       "Q 3016 3291 2770 3770 \n",
       "Q 2525 4250 2034 4250 \n",
       "z\n",
       "M 2034 4750 \n",
       "Q 2819 4750 3233 4129 \n",
       "Q 3647 3509 3647 2328 \n",
       "Q 3647 1150 3233 529 \n",
       "Q 2819 -91 2034 -91 \n",
       "Q 1250 -91 836 529 \n",
       "Q 422 1150 422 2328 \n",
       "Q 422 3509 836 4129 \n",
       "Q 1250 4750 2034 4750 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_2\">\n",
       "     <g id=\"line2d_3\">\n",
       "      <path d=\"M 94.824128 284.4 \n",
       "L 94.824128 7.2 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_4\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"94.824128\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_2\">\n",
       "      <!-- 20000 -->\n",
       "      <g transform=\"translate(78.917878 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-32\" d=\"M 1228 531 \n",
       "L 3431 531 \n",
       "L 3431 0 \n",
       "L 469 0 \n",
       "L 469 531 \n",
       "Q 828 903 1448 1529 \n",
       "Q 2069 2156 2228 2338 \n",
       "Q 2531 2678 2651 2914 \n",
       "Q 2772 3150 2772 3378 \n",
       "Q 2772 3750 2511 3984 \n",
       "Q 2250 4219 1831 4219 \n",
       "Q 1534 4219 1204 4116 \n",
       "Q 875 4013 500 3803 \n",
       "L 500 4441 \n",
       "Q 881 4594 1212 4672 \n",
       "Q 1544 4750 1819 4750 \n",
       "Q 2544 4750 2975 4387 \n",
       "Q 3406 4025 3406 3419 \n",
       "Q 3406 3131 3298 2873 \n",
       "Q 3191 2616 2906 2266 \n",
       "Q 2828 2175 2409 1742 \n",
       "Q 1991 1309 1228 531 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_3\">\n",
       "     <g id=\"line2d_5\">\n",
       "      <path d=\"M 145.710421 284.4 \n",
       "L 145.710421 7.2 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_6\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"145.710421\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_3\">\n",
       "      <!-- 40000 -->\n",
       "      <g transform=\"translate(129.804171 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-34\" d=\"M 2419 4116 \n",
       "L 825 1625 \n",
       "L 2419 1625 \n",
       "L 2419 4116 \n",
       "z\n",
       "M 2253 4666 \n",
       "L 3047 4666 \n",
       "L 3047 1625 \n",
       "L 3713 1625 \n",
       "L 3713 1100 \n",
       "L 3047 1100 \n",
       "L 3047 0 \n",
       "L 2419 0 \n",
       "L 2419 1100 \n",
       "L 313 1100 \n",
       "L 313 1709 \n",
       "L 2253 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-34\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_4\">\n",
       "     <g id=\"line2d_7\">\n",
       "      <path d=\"M 196.596713 284.4 \n",
       "L 196.596713 7.2 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_8\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"196.596713\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_4\">\n",
       "      <!-- 60000 -->\n",
       "      <g transform=\"translate(180.690463 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-36\" d=\"M 2113 2584 \n",
       "Q 1688 2584 1439 2293 \n",
       "Q 1191 2003 1191 1497 \n",
       "Q 1191 994 1439 701 \n",
       "Q 1688 409 2113 409 \n",
       "Q 2538 409 2786 701 \n",
       "Q 3034 994 3034 1497 \n",
       "Q 3034 2003 2786 2293 \n",
       "Q 2538 2584 2113 2584 \n",
       "z\n",
       "M 3366 4563 \n",
       "L 3366 3988 \n",
       "Q 3128 4100 2886 4159 \n",
       "Q 2644 4219 2406 4219 \n",
       "Q 1781 4219 1451 3797 \n",
       "Q 1122 3375 1075 2522 \n",
       "Q 1259 2794 1537 2939 \n",
       "Q 1816 3084 2150 3084 \n",
       "Q 2853 3084 3261 2657 \n",
       "Q 3669 2231 3669 1497 \n",
       "Q 3669 778 3244 343 \n",
       "Q 2819 -91 2113 -91 \n",
       "Q 1303 -91 875 529 \n",
       "Q 447 1150 447 2328 \n",
       "Q 447 3434 972 4092 \n",
       "Q 1497 4750 2381 4750 \n",
       "Q 2619 4750 2861 4703 \n",
       "Q 3103 4656 3366 4563 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-36\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_5\">\n",
       "     <g id=\"line2d_9\">\n",
       "      <path d=\"M 247.483005 284.4 \n",
       "L 247.483005 7.2 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_10\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"247.483005\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_5\">\n",
       "      <!-- 80000 -->\n",
       "      <g transform=\"translate(231.576755 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-38\" d=\"M 2034 2216 \n",
       "Q 1584 2216 1326 1975 \n",
       "Q 1069 1734 1069 1313 \n",
       "Q 1069 891 1326 650 \n",
       "Q 1584 409 2034 409 \n",
       "Q 2484 409 2743 651 \n",
       "Q 3003 894 3003 1313 \n",
       "Q 3003 1734 2745 1975 \n",
       "Q 2488 2216 2034 2216 \n",
       "z\n",
       "M 1403 2484 \n",
       "Q 997 2584 770 2862 \n",
       "Q 544 3141 544 3541 \n",
       "Q 544 4100 942 4425 \n",
       "Q 1341 4750 2034 4750 \n",
       "Q 2731 4750 3128 4425 \n",
       "Q 3525 4100 3525 3541 \n",
       "Q 3525 3141 3298 2862 \n",
       "Q 3072 2584 2669 2484 \n",
       "Q 3125 2378 3379 2068 \n",
       "Q 3634 1759 3634 1313 \n",
       "Q 3634 634 3220 271 \n",
       "Q 2806 -91 2034 -91 \n",
       "Q 1263 -91 848 271 \n",
       "Q 434 634 434 1313 \n",
       "Q 434 1759 690 2068 \n",
       "Q 947 2378 1403 2484 \n",
       "z\n",
       "M 1172 3481 \n",
       "Q 1172 3119 1398 2916 \n",
       "Q 1625 2713 2034 2713 \n",
       "Q 2441 2713 2670 2916 \n",
       "Q 2900 3119 2900 3481 \n",
       "Q 2900 3844 2670 4047 \n",
       "Q 2441 4250 2034 4250 \n",
       "Q 1625 4250 1398 4047 \n",
       "Q 1172 3844 1172 3481 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-38\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_6\">\n",
       "     <g id=\"line2d_11\">\n",
       "      <path d=\"M 298.369298 284.4 \n",
       "L 298.369298 7.2 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_12\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"298.369298\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_6\">\n",
       "      <!-- 100000 -->\n",
       "      <g transform=\"translate(279.281798 298.998438) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-31\" d=\"M 794 531 \n",
       "L 1825 531 \n",
       "L 1825 4091 \n",
       "L 703 3866 \n",
       "L 703 4441 \n",
       "L 1819 4666 \n",
       "L 2450 4666 \n",
       "L 2450 531 \n",
       "L 3481 531 \n",
       "L 3481 0 \n",
       "L 794 0 \n",
       "L 794 531 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"318.115234\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"text_7\">\n",
       "     <!-- step -->\n",
       "     <g transform=\"translate(171.469318 312.676562) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-73\" d=\"M 2834 3397 \n",
       "L 2834 2853 \n",
       "Q 2591 2978 2328 3040 \n",
       "Q 2066 3103 1784 3103 \n",
       "Q 1356 3103 1142 2972 \n",
       "Q 928 2841 928 2578 \n",
       "Q 928 2378 1081 2264 \n",
       "Q 1234 2150 1697 2047 \n",
       "L 1894 2003 \n",
       "Q 2506 1872 2764 1633 \n",
       "Q 3022 1394 3022 966 \n",
       "Q 3022 478 2636 193 \n",
       "Q 2250 -91 1575 -91 \n",
       "Q 1294 -91 989 -36 \n",
       "Q 684 19 347 128 \n",
       "L 347 722 \n",
       "Q 666 556 975 473 \n",
       "Q 1284 391 1588 391 \n",
       "Q 1994 391 2212 530 \n",
       "Q 2431 669 2431 922 \n",
       "Q 2431 1156 2273 1281 \n",
       "Q 2116 1406 1581 1522 \n",
       "L 1381 1569 \n",
       "Q 847 1681 609 1914 \n",
       "Q 372 2147 372 2553 \n",
       "Q 372 3047 722 3315 \n",
       "Q 1072 3584 1716 3584 \n",
       "Q 2034 3584 2315 3537 \n",
       "Q 2597 3491 2834 3397 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-74\" d=\"M 1172 4494 \n",
       "L 1172 3500 \n",
       "L 2356 3500 \n",
       "L 2356 3053 \n",
       "L 1172 3053 \n",
       "L 1172 1153 \n",
       "Q 1172 725 1289 603 \n",
       "Q 1406 481 1766 481 \n",
       "L 2356 481 \n",
       "L 2356 0 \n",
       "L 1766 0 \n",
       "Q 1100 0 847 248 \n",
       "Q 594 497 594 1153 \n",
       "L 594 3053 \n",
       "L 172 3053 \n",
       "L 172 3500 \n",
       "L 594 3500 \n",
       "L 594 4494 \n",
       "L 1172 4494 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-65\" d=\"M 3597 1894 \n",
       "L 3597 1613 \n",
       "L 953 1613 \n",
       "Q 991 1019 1311 708 \n",
       "Q 1631 397 2203 397 \n",
       "Q 2534 397 2845 478 \n",
       "Q 3156 559 3463 722 \n",
       "L 3463 178 \n",
       "Q 3153 47 2828 -22 \n",
       "Q 2503 -91 2169 -91 \n",
       "Q 1331 -91 842 396 \n",
       "Q 353 884 353 1716 \n",
       "Q 353 2575 817 3079 \n",
       "Q 1281 3584 2069 3584 \n",
       "Q 2775 3584 3186 3129 \n",
       "Q 3597 2675 3597 1894 \n",
       "z\n",
       "M 3022 2063 \n",
       "Q 3016 2534 2758 2815 \n",
       "Q 2500 3097 2075 3097 \n",
       "Q 1594 3097 1305 2825 \n",
       "Q 1016 2553 972 2059 \n",
       "L 3022 2063 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-70\" d=\"M 1159 525 \n",
       "L 1159 -1331 \n",
       "L 581 -1331 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2969 \n",
       "Q 1341 3281 1617 3432 \n",
       "Q 1894 3584 2278 3584 \n",
       "Q 2916 3584 3314 3078 \n",
       "Q 3713 2572 3713 1747 \n",
       "Q 3713 922 3314 415 \n",
       "Q 2916 -91 2278 -91 \n",
       "Q 1894 -91 1617 61 \n",
       "Q 1341 213 1159 525 \n",
       "z\n",
       "M 3116 1747 \n",
       "Q 3116 2381 2855 2742 \n",
       "Q 2594 3103 2138 3103 \n",
       "Q 1681 3103 1420 2742 \n",
       "Q 1159 2381 1159 1747 \n",
       "Q 1159 1113 1420 752 \n",
       "Q 1681 391 2138 391 \n",
       "Q 2594 391 2855 752 \n",
       "Q 3116 1113 3116 1747 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-73\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-74\" x=\"52.099609\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-65\" x=\"91.308594\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-70\" x=\"152.832031\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_2\">\n",
       "    <g id=\"ytick_1\">\n",
       "     <g id=\"line2d_13\">\n",
       "      <path d=\"M 30.103125 281.527489 \n",
       "L 334.466761 281.527489 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_14\">\n",
       "      <defs>\n",
       "       <path id=\"m6b9e31c90a\" d=\"M 0 0 \n",
       "L -3.5 0 \n",
       "\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </defs>\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"281.527489\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_8\">\n",
       "      <!-- 0.0 -->\n",
       "      <g transform=\"translate(7.2 285.326708) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-2e\" d=\"M 684 794 \n",
       "L 1344 794 \n",
       "L 1344 0 \n",
       "L 684 0 \n",
       "L 684 794 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_2\">\n",
       "     <g id=\"line2d_15\">\n",
       "      <path d=\"M 30.103125 239.423443 \n",
       "L 334.466761 239.423443 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_16\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"239.423443\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_9\">\n",
       "      <!-- 0.5 -->\n",
       "      <g transform=\"translate(7.2 243.222662) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-35\" d=\"M 691 4666 \n",
       "L 3169 4666 \n",
       "L 3169 4134 \n",
       "L 1269 4134 \n",
       "L 1269 2991 \n",
       "Q 1406 3038 1543 3061 \n",
       "Q 1681 3084 1819 3084 \n",
       "Q 2600 3084 3056 2656 \n",
       "Q 3513 2228 3513 1497 \n",
       "Q 3513 744 3044 326 \n",
       "Q 2575 -91 1722 -91 \n",
       "Q 1428 -91 1123 -41 \n",
       "Q 819 9 494 109 \n",
       "L 494 744 \n",
       "Q 775 591 1075 516 \n",
       "Q 1375 441 1709 441 \n",
       "Q 2250 441 2565 725 \n",
       "Q 2881 1009 2881 1497 \n",
       "Q 2881 1984 2565 2268 \n",
       "Q 2250 2553 1709 2553 \n",
       "Q 1456 2553 1204 2497 \n",
       "Q 953 2441 691 2322 \n",
       "L 691 4666 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_3\">\n",
       "     <g id=\"line2d_17\">\n",
       "      <path d=\"M 30.103125 197.319396 \n",
       "L 334.466761 197.319396 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_18\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"197.319396\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_10\">\n",
       "      <!-- 1.0 -->\n",
       "      <g transform=\"translate(7.2 201.118615) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_4\">\n",
       "     <g id=\"line2d_19\">\n",
       "      <path d=\"M 30.103125 155.21535 \n",
       "L 334.466761 155.21535 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_20\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"155.21535\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_11\">\n",
       "      <!-- 1.5 -->\n",
       "      <g transform=\"translate(7.2 159.014569) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_5\">\n",
       "     <g id=\"line2d_21\">\n",
       "      <path d=\"M 30.103125 113.111304 \n",
       "L 334.466761 113.111304 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_22\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"113.111304\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_12\">\n",
       "      <!-- 2.0 -->\n",
       "      <g transform=\"translate(7.2 116.910522) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_6\">\n",
       "     <g id=\"line2d_23\">\n",
       "      <path d=\"M 30.103125 71.007257 \n",
       "L 334.466761 71.007257 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_24\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"71.007257\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_13\">\n",
       "      <!-- 2.5 -->\n",
       "      <g transform=\"translate(7.2 74.806476) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-35\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_7\">\n",
       "     <g id=\"line2d_25\">\n",
       "      <path d=\"M 30.103125 28.903211 \n",
       "L 334.466761 28.903211 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_26\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"30.103125\" y=\"28.903211\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_14\">\n",
       "      <!-- 3.0 -->\n",
       "      <g transform=\"translate(7.2 32.70243) scale(0.1 -0.1)\">\n",
       "       <defs>\n",
       "        <path id=\"DejaVuSans-33\" d=\"M 2597 2516 \n",
       "Q 3050 2419 3304 2112 \n",
       "Q 3559 1806 3559 1356 \n",
       "Q 3559 666 3084 287 \n",
       "Q 2609 -91 1734 -91 \n",
       "Q 1441 -91 1130 -33 \n",
       "Q 819 25 488 141 \n",
       "L 488 750 \n",
       "Q 750 597 1062 519 \n",
       "Q 1375 441 1716 441 \n",
       "Q 2309 441 2620 675 \n",
       "Q 2931 909 2931 1356 \n",
       "Q 2931 1769 2642 2001 \n",
       "Q 2353 2234 1838 2234 \n",
       "L 1294 2234 \n",
       "L 1294 2753 \n",
       "L 1863 2753 \n",
       "Q 2328 2753 2575 2939 \n",
       "Q 2822 3125 2822 3475 \n",
       "Q 2822 3834 2567 4026 \n",
       "Q 2313 4219 1838 4219 \n",
       "Q 1578 4219 1281 4162 \n",
       "Q 984 4106 628 3988 \n",
       "L 628 4550 \n",
       "Q 988 4650 1302 4700 \n",
       "Q 1616 4750 1894 4750 \n",
       "Q 2613 4750 3031 4423 \n",
       "Q 3450 4097 3450 3541 \n",
       "Q 3450 3153 3228 2886 \n",
       "Q 3006 2619 2597 2516 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       </defs>\n",
       "       <use xlink:href=\"#DejaVuSans-33\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"line2d_27\">\n",
       "    <path d=\"M 43.937836 19.8 \n",
       "L 69.380982 271.8 \n",
       "L 94.824128 245.595593 \n",
       "L 120.267274 233.84086 \n",
       "L 145.710421 254.665765 \n",
       "L 171.153567 185.946035 \n",
       "L 196.596713 240.200412 \n",
       "L 222.039859 258.689012 \n",
       "L 247.483005 271.028051 \n",
       "L 272.926152 267.718255 \n",
       "L 298.369298 263.274566 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"line2d_28\">\n",
       "    <path d=\"M 43.937836 67.906202 \n",
       "L 53.479016 231.769449 \n",
       "L 63.020195 236.074279 \n",
       "L 72.561375 237.954482 \n",
       "L 82.102555 237.918512 \n",
       "L 91.643735 238.958708 \n",
       "L 101.184915 241.454891 \n",
       "L 110.726095 239.962805 \n",
       "L 120.267274 239.796254 \n",
       "L 129.808454 241.931785 \n",
       "L 139.349634 242.104692 \n",
       "L 148.890814 241.757529 \n",
       "L 158.431994 242.830944 \n",
       "L 167.973173 242.241826 \n",
       "L 177.514353 241.541829 \n",
       "L 187.055533 243.990967 \n",
       "L 196.596713 245.026547 \n",
       "L 206.137893 244.621398 \n",
       "L 215.679073 243.893964 \n",
       "L 225.220252 243.119054 \n",
       "L 234.761432 247.028492 \n",
       "L 244.302612 244.375045 \n",
       "L 253.843792 243.342235 \n",
       "L 263.384972 244.746219 \n",
       "L 272.926152 243.432358 \n",
       "L 282.467331 243.417547 \n",
       "L 292.008511 244.495877 \n",
       "L 301.549691 245.354793 \n",
       "L 311.090871 247.580693 \n",
       "L 320.632051 245.047923 \n",
       "\" clip-path=\"url(#pefbfba75fd)\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_3\">\n",
       "    <path d=\"M 30.103125 284.4 \n",
       "L 30.103125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_4\">\n",
       "    <path d=\"M 334.466761 284.4 \n",
       "L 334.466761 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_5\">\n",
       "    <path d=\"M 30.103125 284.4 \n",
       "L 334.466761 284.4 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_6\">\n",
       "    <path d=\"M 30.103125 7.2 \n",
       "L 334.466761 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"legend_1\">\n",
       "    <g id=\"patch_7\">\n",
       "     <path d=\"M 247.876136 45.1125 \n",
       "L 327.466761 45.1125 \n",
       "Q 329.466761 45.1125 329.466761 43.1125 \n",
       "L 329.466761 14.2 \n",
       "Q 329.466761 12.2 327.466761 12.2 \n",
       "L 247.876136 12.2 \n",
       "Q 245.876136 12.2 245.876136 14.2 \n",
       "L 245.876136 43.1125 \n",
       "Q 245.876136 45.1125 247.876136 45.1125 \n",
       "z\n",
       "\" style=\"fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter\"/>\n",
       "    </g>\n",
       "    <g id=\"line2d_29\">\n",
       "     <path d=\"M 249.876136 20.298437 \n",
       "L 259.876136 20.298437 \n",
       "L 269.876136 20.298437 \n",
       "\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_15\">\n",
       "     <!-- train_loss -->\n",
       "     <g transform=\"translate(277.876136 23.798437) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-72\" d=\"M 2631 2963 \n",
       "Q 2534 3019 2420 3045 \n",
       "Q 2306 3072 2169 3072 \n",
       "Q 1681 3072 1420 2755 \n",
       "Q 1159 2438 1159 1844 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2956 \n",
       "Q 1341 3275 1631 3429 \n",
       "Q 1922 3584 2338 3584 \n",
       "Q 2397 3584 2469 3576 \n",
       "Q 2541 3569 2628 3553 \n",
       "L 2631 2963 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-61\" d=\"M 2194 1759 \n",
       "Q 1497 1759 1228 1600 \n",
       "Q 959 1441 959 1056 \n",
       "Q 959 750 1161 570 \n",
       "Q 1363 391 1709 391 \n",
       "Q 2188 391 2477 730 \n",
       "Q 2766 1069 2766 1631 \n",
       "L 2766 1759 \n",
       "L 2194 1759 \n",
       "z\n",
       "M 3341 1997 \n",
       "L 3341 0 \n",
       "L 2766 0 \n",
       "L 2766 531 \n",
       "Q 2569 213 2275 61 \n",
       "Q 1981 -91 1556 -91 \n",
       "Q 1019 -91 701 211 \n",
       "Q 384 513 384 1019 \n",
       "Q 384 1609 779 1909 \n",
       "Q 1175 2209 1959 2209 \n",
       "L 2766 2209 \n",
       "L 2766 2266 \n",
       "Q 2766 2663 2505 2880 \n",
       "Q 2244 3097 1772 3097 \n",
       "Q 1472 3097 1187 3025 \n",
       "Q 903 2953 641 2809 \n",
       "L 641 3341 \n",
       "Q 956 3463 1253 3523 \n",
       "Q 1550 3584 1831 3584 \n",
       "Q 2591 3584 2966 3190 \n",
       "Q 3341 2797 3341 1997 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-69\" d=\"M 603 3500 \n",
       "L 1178 3500 \n",
       "L 1178 0 \n",
       "L 603 0 \n",
       "L 603 3500 \n",
       "z\n",
       "M 603 4863 \n",
       "L 1178 4863 \n",
       "L 1178 4134 \n",
       "L 603 4134 \n",
       "L 603 4863 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6e\" d=\"M 3513 2113 \n",
       "L 3513 0 \n",
       "L 2938 0 \n",
       "L 2938 2094 \n",
       "Q 2938 2591 2744 2837 \n",
       "Q 2550 3084 2163 3084 \n",
       "Q 1697 3084 1428 2787 \n",
       "Q 1159 2491 1159 1978 \n",
       "L 1159 0 \n",
       "L 581 0 \n",
       "L 581 3500 \n",
       "L 1159 3500 \n",
       "L 1159 2956 \n",
       "Q 1366 3272 1645 3428 \n",
       "Q 1925 3584 2291 3584 \n",
       "Q 2894 3584 3203 3211 \n",
       "Q 3513 2838 3513 2113 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-5f\" d=\"M 3263 -1063 \n",
       "L 3263 -1509 \n",
       "L -63 -1509 \n",
       "L -63 -1063 \n",
       "L 3263 -1063 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6c\" d=\"M 603 4863 \n",
       "L 1178 4863 \n",
       "L 1178 0 \n",
       "L 603 0 \n",
       "L 603 4863 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "       <path id=\"DejaVuSans-6f\" d=\"M 1959 3097 \n",
       "Q 1497 3097 1228 2736 \n",
       "Q 959 2375 959 1747 \n",
       "Q 959 1119 1226 758 \n",
       "Q 1494 397 1959 397 \n",
       "Q 2419 397 2687 759 \n",
       "Q 2956 1122 2956 1747 \n",
       "Q 2956 2369 2687 2733 \n",
       "Q 2419 3097 1959 3097 \n",
       "z\n",
       "M 1959 3584 \n",
       "Q 2709 3584 3137 3096 \n",
       "Q 3566 2609 3566 1747 \n",
       "Q 3566 888 3137 398 \n",
       "Q 2709 -91 1959 -91 \n",
       "Q 1206 -91 779 398 \n",
       "Q 353 888 353 1747 \n",
       "Q 353 2609 779 3096 \n",
       "Q 1206 3584 1959 3584 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-72\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"80.322266\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-69\" x=\"141.601562\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6e\" x=\"169.384766\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"232.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"282.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6f\" x=\"310.546875\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"371.728516\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"423.828125\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"line2d_30\">\n",
       "     <path d=\"M 249.876136 35.254687 \n",
       "L 259.876136 35.254687 \n",
       "L 269.876136 35.254687 \n",
       "\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_16\">\n",
       "     <!-- val_loss -->\n",
       "     <g transform=\"translate(277.876136 38.754687) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-76\" d=\"M 191 3500 \n",
       "L 800 3500 \n",
       "L 1894 563 \n",
       "L 2988 3500 \n",
       "L 3597 3500 \n",
       "L 2284 0 \n",
       "L 1503 0 \n",
       "L 191 3500 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-76\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"59.179688\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"120.458984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"148.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"198.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6f\" x=\"226.025391\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"287.207031\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-73\" x=\"339.306641\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       "  <g id=\"axes_2\">\n",
       "   <g id=\"patch_8\">\n",
       "    <path d=\"M 395.339489 284.4 \n",
       "L 699.703125 284.4 \n",
       "L 699.703125 7.2 \n",
       "L 395.339489 7.2 \n",
       "z\n",
       "\" style=\"fill: #ffffff\"/>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_3\">\n",
       "    <g id=\"xtick_7\">\n",
       "     <g id=\"line2d_31\">\n",
       "      <path d=\"M 409.174199 284.4 \n",
       "L 409.174199 7.2 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_32\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"409.174199\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_17\">\n",
       "      <!-- 0 -->\n",
       "      <g transform=\"translate(405.992949 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_8\">\n",
       "     <g id=\"line2d_33\">\n",
       "      <path d=\"M 460.060492 284.4 \n",
       "L 460.060492 7.2 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_34\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"460.060492\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_18\">\n",
       "      <!-- 20000 -->\n",
       "      <g transform=\"translate(444.154242 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-32\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_9\">\n",
       "     <g id=\"line2d_35\">\n",
       "      <path d=\"M 510.946784 284.4 \n",
       "L 510.946784 7.2 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_36\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"510.946784\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_19\">\n",
       "      <!-- 40000 -->\n",
       "      <g transform=\"translate(495.040534 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-34\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_10\">\n",
       "     <g id=\"line2d_37\">\n",
       "      <path d=\"M 561.833077 284.4 \n",
       "L 561.833077 7.2 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_38\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"561.833077\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_20\">\n",
       "      <!-- 60000 -->\n",
       "      <g transform=\"translate(545.926827 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-36\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_11\">\n",
       "     <g id=\"line2d_39\">\n",
       "      <path d=\"M 612.719369 284.4 \n",
       "L 612.719369 7.2 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_40\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"612.719369\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_21\">\n",
       "      <!-- 80000 -->\n",
       "      <g transform=\"translate(596.813119 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-38\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"xtick_12\">\n",
       "     <g id=\"line2d_41\">\n",
       "      <path d=\"M 663.605661 284.4 \n",
       "L 663.605661 7.2 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_42\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m946cae5094\" x=\"663.605661\" y=\"284.4\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_22\">\n",
       "      <!-- 100000 -->\n",
       "      <g transform=\"translate(644.518161 298.998438) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"127.246094\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"190.869141\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"254.492188\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"318.115234\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"text_23\">\n",
       "     <!-- step -->\n",
       "     <g transform=\"translate(536.705682 312.676562) scale(0.1 -0.1)\">\n",
       "      <use xlink:href=\"#DejaVuSans-73\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-74\" x=\"52.099609\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-65\" x=\"91.308594\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-70\" x=\"152.832031\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"matplotlib.axis_4\">\n",
       "    <g id=\"ytick_8\">\n",
       "     <g id=\"line2d_43\">\n",
       "      <path d=\"M 395.339489 237.581139 \n",
       "L 699.703125 237.581139 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_44\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"395.339489\" y=\"237.581139\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_24\">\n",
       "      <!-- 0.2 -->\n",
       "      <g transform=\"translate(372.436364 241.380357) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-32\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_9\">\n",
       "     <g id=\"line2d_45\">\n",
       "      <path d=\"M 395.339489 183.135854 \n",
       "L 699.703125 183.135854 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_46\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"395.339489\" y=\"183.135854\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_25\">\n",
       "      <!-- 0.4 -->\n",
       "      <g transform=\"translate(372.436364 186.935073) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-34\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_10\">\n",
       "     <g id=\"line2d_47\">\n",
       "      <path d=\"M 395.339489 128.690569 \n",
       "L 699.703125 128.690569 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_48\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"395.339489\" y=\"128.690569\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_26\">\n",
       "      <!-- 0.6 -->\n",
       "      <g transform=\"translate(372.436364 132.489788) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-36\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_11\">\n",
       "     <g id=\"line2d_49\">\n",
       "      <path d=\"M 395.339489 74.245285 \n",
       "L 699.703125 74.245285 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_50\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"395.339489\" y=\"74.245285\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_27\">\n",
       "      <!-- 0.8 -->\n",
       "      <g transform=\"translate(372.436364 78.044503) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-30\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-38\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"ytick_12\">\n",
       "     <g id=\"line2d_51\">\n",
       "      <path d=\"M 395.339489 19.8 \n",
       "L 699.703125 19.8 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #b0b0b0; stroke-width: 0.8; stroke-linecap: square\"/>\n",
       "     </g>\n",
       "     <g id=\"line2d_52\">\n",
       "      <g>\n",
       "       <use xlink:href=\"#m6b9e31c90a\" x=\"395.339489\" y=\"19.8\" style=\"stroke: #000000; stroke-width: 0.8\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "     <g id=\"text_28\">\n",
       "      <!-- 1.0 -->\n",
       "      <g transform=\"translate(372.436364 23.599219) scale(0.1 -0.1)\">\n",
       "       <use xlink:href=\"#DejaVuSans-31\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-2e\" x=\"63.623047\"/>\n",
       "       <use xlink:href=\"#DejaVuSans-30\" x=\"95.410156\"/>\n",
       "      </g>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "   <g id=\"line2d_53\">\n",
       "    <path d=\"M 409.174199 240.983969 \n",
       "L 434.617346 19.8 \n",
       "L 460.060492 70.842454 \n",
       "L 485.503638 53.828303 \n",
       "L 510.946784 53.828303 \n",
       "L 536.38993 121.884909 \n",
       "L 561.833077 70.842454 \n",
       "L 587.276223 36.814151 \n",
       "L 612.719369 19.8 \n",
       "L 638.162515 36.814151 \n",
       "L 663.605661 53.828303 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"line2d_54\">\n",
       "    <path d=\"M 409.174199 271.8 \n",
       "L 418.715379 64.690137 \n",
       "L 428.256559 62.893443 \n",
       "L 437.797739 60.089511 \n",
       "L 447.338919 59.87173 \n",
       "L 456.880098 58.619488 \n",
       "L 466.421278 56.006114 \n",
       "L 475.962458 55.325548 \n",
       "L 485.503638 57.421692 \n",
       "L 495.044818 58.456152 \n",
       "L 504.585998 56.360009 \n",
       "L 514.127177 55.216658 \n",
       "L 523.668357 54.263865 \n",
       "L 533.209537 56.632235 \n",
       "L 542.750717 57.258356 \n",
       "L 552.291897 55.379994 \n",
       "L 561.833077 54.672205 \n",
       "L 571.374256 55.65222 \n",
       "L 580.915436 55.733888 \n",
       "L 590.456616 52.957178 \n",
       "L 599.997796 53.80108 \n",
       "L 609.538976 52.87551 \n",
       "L 619.080155 56.57779 \n",
       "L 628.621335 55.951669 \n",
       "L 638.162515 58.320039 \n",
       "L 647.703695 60.116733 \n",
       "L 657.244875 54.672205 \n",
       "L 666.786055 55.761111 \n",
       "L 676.327234 52.712175 \n",
       "L 685.868414 54.61776 \n",
       "\" clip-path=\"url(#pde11dab7f4)\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_9\">\n",
       "    <path d=\"M 395.339489 284.4 \n",
       "L 395.339489 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_10\">\n",
       "    <path d=\"M 699.703125 284.4 \n",
       "L 699.703125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_11\">\n",
       "    <path d=\"M 395.339489 284.4 \n",
       "L 699.703125 284.4 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"patch_12\">\n",
       "    <path d=\"M 395.339489 7.2 \n",
       "L 699.703125 7.2 \n",
       "\" style=\"fill: none; stroke: #000000; stroke-width: 0.8; stroke-linejoin: miter; stroke-linecap: square\"/>\n",
       "   </g>\n",
       "   <g id=\"legend_2\">\n",
       "    <g id=\"patch_13\">\n",
       "     <path d=\"M 615.303125 279.4 \n",
       "L 692.703125 279.4 \n",
       "Q 694.703125 279.4 694.703125 277.4 \n",
       "L 694.703125 248.4875 \n",
       "Q 694.703125 246.4875 692.703125 246.4875 \n",
       "L 615.303125 246.4875 \n",
       "Q 613.303125 246.4875 613.303125 248.4875 \n",
       "L 613.303125 277.4 \n",
       "Q 613.303125 279.4 615.303125 279.4 \n",
       "z\n",
       "\" style=\"fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter\"/>\n",
       "    </g>\n",
       "    <g id=\"line2d_55\">\n",
       "     <path d=\"M 617.303125 254.585938 \n",
       "L 627.303125 254.585938 \n",
       "L 637.303125 254.585938 \n",
       "\" style=\"fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_29\">\n",
       "     <!-- train_acc -->\n",
       "     <g transform=\"translate(645.303125 258.085938) scale(0.1 -0.1)\">\n",
       "      <defs>\n",
       "       <path id=\"DejaVuSans-63\" d=\"M 3122 3366 \n",
       "L 3122 2828 \n",
       "Q 2878 2963 2633 3030 \n",
       "Q 2388 3097 2138 3097 \n",
       "Q 1578 3097 1268 2742 \n",
       "Q 959 2388 959 1747 \n",
       "Q 959 1106 1268 751 \n",
       "Q 1578 397 2138 397 \n",
       "Q 2388 397 2633 464 \n",
       "Q 2878 531 3122 666 \n",
       "L 3122 134 \n",
       "Q 2881 22 2623 -34 \n",
       "Q 2366 -91 2075 -91 \n",
       "Q 1284 -91 818 406 \n",
       "Q 353 903 353 1747 \n",
       "Q 353 2603 823 3093 \n",
       "Q 1294 3584 2113 3584 \n",
       "Q 2378 3584 2631 3529 \n",
       "Q 2884 3475 3122 3366 \n",
       "z\n",
       "\" transform=\"scale(0.015625)\"/>\n",
       "      </defs>\n",
       "      <use xlink:href=\"#DejaVuSans-74\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-72\" x=\"39.208984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"80.322266\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-69\" x=\"141.601562\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6e\" x=\"169.384766\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"232.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"282.763672\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"344.042969\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"399.023438\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "    <g id=\"line2d_56\">\n",
       "     <path d=\"M 617.303125 269.542188 \n",
       "L 627.303125 269.542188 \n",
       "L 637.303125 269.542188 \n",
       "\" style=\"fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square\"/>\n",
       "    </g>\n",
       "    <g id=\"text_30\">\n",
       "     <!-- val_acc -->\n",
       "     <g transform=\"translate(645.303125 273.042188) scale(0.1 -0.1)\">\n",
       "      <use xlink:href=\"#DejaVuSans-76\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"59.179688\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-6c\" x=\"120.458984\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-5f\" x=\"148.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-61\" x=\"198.242188\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"259.521484\"/>\n",
       "      <use xlink:href=\"#DejaVuSans-63\" x=\"314.501953\"/>\n",
       "     </g>\n",
       "    </g>\n",
       "   </g>\n",
       "  </g>\n",
       " </g>\n",
       " <defs>\n",
       "  <clipPath id=\"pefbfba75fd\">\n",
       "   <rect x=\"30.103125\" y=\"7.2\" width=\"304.363636\" height=\"277.2\"/>\n",
       "  </clipPath>\n",
       "  <clipPath id=\"pde11dab7f4\">\n",
       "   <rect x=\"395.339489\" y=\"7.2\" width=\"304.363636\" height=\"277.2\"/>\n",
       "  </clipPath>\n",
       " </defs>\n",
       "</svg>\n"
      ],
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画线要注意的是损失是不一定在零到1之间的\n",
    "def plot_learning_curves(record_dict, sample_step=500):\n",
    "    # build DataFrame\n",
    "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
    "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
    "\n",
    "    # plot\n",
    "    fig_num = len(train_df.columns)\n",
    "    fig, axs = plt.subplots(1, fig_num, figsize=(6 * fig_num, 5))\n",
    "    for idx, item in enumerate(train_df.columns):    \n",
    "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
    "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
    "        axs[idx].grid()\n",
    "        axs[idx].legend()\n",
    "        axs[idx].set_xlabel(\"step\")\n",
    "    \n",
    "    plt.show()\n",
    "\n",
    "plot_learning_curves(record, sample_step=10000)  #横坐标是 steps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loss:     0.4031\n",
      "accuracy: 0.8791\n"
     ]
    }
   ],
   "source": [
    "# dataload for evaluating\n",
    "\n",
    "# load checkpoints\n",
    "model.load_state_dict(torch.load(\"checkpoints/bn/best.ckpt\", map_location=\"cpu\"))\n",
    "\n",
    "model.eval()\n",
    "loss, acc = evaluating(model, val_loader, loss_fct)\n",
    "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
